package main

import (
	"errors"
	"fmt"
)

// 1.实现一个函数，接受若干个float64（用不定长参数），返回这些参数乘积的倒数，除数为0时返回error
// 2.上题用递归实现
// 3.定义两个接口：鱼类和爬行动物，再定义一个结构体：青蛙，同时实现上述两个接口
// 4.实现函数func square(num interface{}) interface{}，计算一个interface{}的平方，
// interface{}允许是4种类型：float32、float64、int、byte

/**************************** Question1 ****************************/
func ForTheBottom(nums ...float64) (float64, error) {
	if len(nums) == 0 {
		return 0, errors.New("参数为空！")
	}
	var product float64 = 1.0
	for _, num := range nums {
		product *= num
	}

	if product == 0 {
		return 0, errors.New("除零错误！")
	}

	return 1 / product, nil
}

/**************************** Question2 ****************************/
func ForTheBottom2(nums ...float64) (float64, error) {
	if len(nums) == 0 {
		return 0, errors.New("参数为空！")
	}

	num := nums[0]
	if num == 0 {
		return 0, errors.New("除零错误")
	}

	if len(nums) == 1 {
		return 1 / num, nil
	}

	arr := nums[1:]
	prod, err := ForTheBottom2(arr...)
	if err != nil {
		return 0, err
	}

	return 1 / num * prod, nil
}

/**************************** Question3 ****************************/
type Fish interface {
	Swimming()
	Breathing()
}

type Reptiles interface {
	Crawling()
}

type Frog struct {
}

func (Frog) Swimming() {
	fmt.Println("鱼会游泳，青蛙也会")
}

func (Frog) Breathing() {
	fmt.Println("鱼会在水里呼吸，青蛙也能在水里呼吸")
}

func (Frog) Crawling() {
	fmt.Println("青蛙也能在陆地上爬")
}

/**************************** Question4 ****************************/
func square(num interface{}) interface{} {
	switch val := num.(type) {
	case byte:
		return val * val
	case int:
		return val * val
	case float32:
		return val * val
	case float64:
		return val * val
	default:
		return "暂时没有支持此类型"
	}
}

func main() {
	res, err := ForTheBottom(7, 8, 9)
	fmt.Printf("结果 = %f, err = %v\n", res, err)
	res, err = ForTheBottom2(2, 3, 4, 5)
	fmt.Printf("结果 = %f, err = %v\n", res, err)
	frog := Frog{}
	frog.Swimming()
	frog.Breathing()
	frog.Crawling()
	fmt.Printf("2的平方等于%d\n", square(2))
	fmt.Printf("3.14的平方等于%f\n", square(3.14))
}
